From: tsteven4 Date: Wed, 9 Jan 2019 15:10:49 +0000 (-0700) Subject: fix trackfilter merge bug with segments. X-Git-Tag: archive/raspbian/1.10.0+ds-2+rpi1~1^2~12^2~8^2~45^2 X-Git-Url: https://dgit.raspbian.org/%22http:/www.example.com/cgi/%22https://%22Program/%22http:/www.example.com/cgi/%22https:/%22Program?a=commitdiff_plain;h=a532c99f9f68c3b74bd9f877cea7eb2ed587db30;p=gpsbabel.git fix trackfilter merge bug with segments. enhance trackfilter test cases for better coverage. --- diff --git a/reference/track/trackfilter3.gpx b/reference/track/trackfilter3.gpx new file mode 100644 index 000000000..19d109d92 --- /dev/null +++ b/reference/track/trackfilter3.gpx @@ -0,0 +1,266 @@ + + + + + + LOG-2002-05-25T17:06:21Z + + + 1.000 + + + + 0.000 + + + + 0.000 + + + + 0.000 + + + + 0.000 + + + + 0.000 + + + + 0.000 + + + + 0.000 + + + + 0.000 + + + + 0.000 + + + + 0.000 + + + + 0.000 + + + + 0.000 + + + + 0.000 + + + + 0.000 + + + + 2.000 + + + + 0.000 + + + + 1.000 + + + + 0.000 + + + + 0.000 + + + + 0.000 + + + + 0.000 + + + + 2.000 + + + + 1.000 + + + + 1.000 + + + + 0.000 + + + + 2.000 + + + + 0.000 + + + + 0.000 + + + + 0.000 + + + + 0.000 + + + + 0.000 + + + + 6.000 + + + + 2.000 + + + + 0.000 + + + + 0.000 + + + + 0.000 + + + + 0.000 + + + + 1.000 + + + + 0.000 + + + + 0.000 + + + + 6.000 + + + + 0.000 + + + + 0.000 + + + + 0.000 + + + + 0.000 + + + + 0.000 + + + + 0.000 + + + + 0.000 + + + + 0.000 + + + + 0.000 + + + + 0.000 + + + + 0.000 + + + + 0.000 + + + + 0.000 + + + + 0.000 + + + + 7.000 + + + + 0.000 + + + + 0.000 + + + + 0.000 + + + + 0.000 + + + + 0.000 + + + + 0.000 + + + + 0.000 + + + + + diff --git a/reference/track/trackfilter_merge.gpx b/reference/track/trackfilter_merge.gpx new file mode 100644 index 000000000..a59e64de7 --- /dev/null +++ b/reference/track/trackfilter_merge.gpx @@ -0,0 +1,46 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/reference/track/trackfilter_merge~gpx.gpx b/reference/track/trackfilter_merge~gpx.gpx new file mode 100644 index 000000000..04e90d1f8 --- /dev/null +++ b/reference/track/trackfilter_merge~gpx.gpx @@ -0,0 +1,53 @@ + + + + + + + + + 0.000000 + + + + 55.021885 + + + + 60.024025 + + + + 65.026169 + + + + 70.027756 + + + + 75.029892 + + + + 80.032036 + + + + 85.034180 + + + + 90.035759 + + + + 95.038460 + + + + 100.039490 + + + + diff --git a/reference/track/trackfilter_trk2seg.gpx b/reference/track/trackfilter_trk2seg.gpx new file mode 100644 index 000000000..9c4c8f405 --- /dev/null +++ b/reference/track/trackfilter_trk2seg.gpx @@ -0,0 +1,46 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/reference/track/trackfilter_trk2seg~gpx.gpx b/reference/track/trackfilter_trk2seg~gpx.gpx new file mode 100644 index 000000000..970bedba7 --- /dev/null +++ b/reference/track/trackfilter_trk2seg~gpx.gpx @@ -0,0 +1,55 @@ + + + + + + + + + 0.000000 + + + + 55.021885 + + + + 60.024025 + + + + 65.026169 + + + + 70.027756 + + + + + + 0.000000 + + + + 80.032036 + + + + 85.034180 + + + + 90.035759 + + + + 95.038460 + + + + 100.039490 + + + + diff --git a/testo.d/track.test b/testo.d/track.test index 84a6dba3c..90aea72d9 100644 --- a/testo.d/track.test +++ b/testo.d/track.test @@ -16,6 +16,9 @@ compare ${REFERENCE}/track/trackfilter-sdistance.gpx ${TMPDIR}/trackfilter2.gpx gpsbabel -t -i gpx -f ${REFERENCE}/track/trackfilter.gpx -x track,pack,sdistance=0.1k,split=5m,title=%Y%m%d -o gpx -F ${TMPDIR}/trackfilter-sdistance2.gpx compare ${REFERENCE}/track/trackfilter-sdistance2.gpx ${TMPDIR}/trackfilter-sdistance2.gpx +gpsbabel -i gpx -f ${REFERENCE}/track/trackfilter.gpx -x track,pack,title=LOG-%FT%TZ -o gpx -F ${TMPDIR}/trackfilter3.gpx +compare ${REFERENCE}/track/trackfilter3.gpx ${TMPDIR}/trackfilter3.gpx + # Exercise the 'faketime' filter. The middle of the three points has # time so we can exercise the 'forced' option, too. gpsbabel -t -i unicsv -f ${REFERENCE}/track/trackfilter_faketime.txt -x track,faketime=20100506060000+5 -o gpx -F ${TMPDIR}/ft.gpx @@ -51,6 +54,14 @@ compare ${REFERENCE}/track/trackfilter-move-d.gpx ${TMPDIR}/trackfilter-move-d.g gpsbabel -t -i gpx -f ${REFERENCE}/track/trackfilter.gpx -x track,move=-5m,name=LOG-20020527,start=20020527185742,stop=20020527185950,minimum_points=2 -o gpx -F ${TMPDIR}/trackfilter-move-m.gpx compare ${REFERENCE}/track/trackfilter-move-m.gpx ${TMPDIR}/trackfilter-move-m.gpx +# actually test a merge +gpsbabel -t -i gpx -f ${REFERENCE}/track/trackfilter_merge.gpx -x track,merge -x track,speed -o gpx -F ${TMPDIR}/trackfilter_merge~gpx.gpx +compare ${REFERENCE}/track/trackfilter_merge~gpx.gpx ${TMPDIR}/trackfilter_merge~gpx.gpx + +# test trk2seg +gpsbabel -t -i gpx -f ${REFERENCE}/track/trackfilter_trk2seg.gpx -x track,speed,trk2seg -o gpx -F ${TMPDIR}/trackfilter_trk2seg~gpx.gpx +compare ${REFERENCE}/track/trackfilter_trk2seg~gpx.gpx ${TMPDIR}/trackfilter_trk2seg~gpx.gpx + # speed with msec gpsbabel -t -i unicsv -f ${REFERENCE}/track/utm_subsecond_track.csv -x track,speed -o unicsv,utc -F ${TMPDIR}/utm_subsecond_track~csv.csv compare ${REFERENCE}/track/utm_subsecond_track~csv.csv ${TMPDIR}/utm_subsecond_track~csv.csv diff --git a/trackfilter.cc b/trackfilter.cc index bc81790e7..e6c4bdde1 100644 --- a/trackfilter.cc +++ b/trackfilter.cc @@ -350,17 +350,18 @@ void TrackFilter::trackfilter_merge() queue* elem, *tmp; QUEUE_FOR_EACH(&track->waypoint_list, elem, tmp) { auto wpt = reinterpret_cast(elem); + track_del_wpt(track, wpt); /* copies any new_trkseg flag forward, and clears new_trkseg flag. */ if (wpt->creation_time.isValid()) { - buff.append(new Waypoint(*wpt)); // we will put the merged points in one track segment, // as it isn't clear how track segments in the original tracks // should relate to the merged track. + // track_del_wpt cleared new_trkseg flag for wpt. // track_add_wpt will set new_trkseg for the first point - // after the sort. - wpt->wpt_flags.new_trkseg = 0; + // added to a track. + buff.append(wpt); + } else { + delete wpt; } - track_del_wpt(track, wpt); // copies any new_trkseg flag forward. - delete wpt; } if (it != track_list.begin()) { track_del_head(track);